package sifeap.bl.ejb.usuarios;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import sifeap.bridge.VinculadosBridge;
import sifeap.dal.ejb.usuarios.PreguntaSeguridadDALLocal;
import sifeap.dal.ejb.usuarios.UsuarioDALLocal;
import sifeap.entities.usuarios.PreguntaSeguridad;
import sifeap.entities.usuarios.Usuario;
import sifeap.entities.usuarios.valueobject.UsuarioVO;
import sifeap.exception.SifeapException;
import sifeap.util.Util;
import sifeap.wrappers.asociados.VinculadoWrapper;

/**
 * Session Bean implementation class EventoBL
 */
@Stateless(name="UsuarioBL")
public class UsuarioBL implements UsuarioBLLocal {

	@EJB
	private UsuarioDALLocal usuarioDAL;
	
	@EJB
	private PreguntaSeguridadDALLocal preguntaSeguridadDAL;
	
    /**
     * Default constructor. 
     */
    public UsuarioBL() {}

    /**
	 * Crea un usuario nuevo
	 * @param usuarioVo Value Object de usuario.
	 * @return 0 si se produce un error. 1 si se guarda correctamente el usuario. 
	 * 2 si el usuario ya existe. 3 Si las contrasenas no concuerda.
	 * @throws SifeapException
	 */
	@Override
	public byte crear(UsuarioVO usuarioVo) throws SifeapException {
		try{
			//Verifica si el usuario no existe
			Usuario usuario = this.buscar(usuarioVo.getUsuario().getNombreUsuario());
			if (usuario != null && usuario.getNombreUsuario() != null) {
				//El usuario Existe
				return 2;
			}
			
			usuario = usuarioVo.getUsuario();
			
			//Verifica que las contrasenas concuerden
			if (!usuario.getPassword().equals(usuarioVo.getConfirmarContrasena())) {
				//Las contrasenas no concuerda
				return 3;
			}
			
			//Encripto la contrasena
			usuario.setPassword(Util.encriptar(usuario.getPassword()));
			
			usuarioDAL.crear(usuario);
			return 1;
		}catch (Exception e) {
			throw new SifeapException(e);
		}
	}

	@Override
	public List<Usuario> buscarTodos() throws SifeapException {
		try{
			return usuarioDAL.buscarTodos();
		}catch (Exception e) {
			throw new SifeapException(e);
		}
	}

	@Override
	public boolean modificar(Usuario usuario) throws SifeapException {
		try {
			usuarioDAL.modificar(usuario);
			return true;
		} catch (Exception e) {
			throw new SifeapException(e);
		}
	}

	@Override
	public boolean eliminar(Usuario usuario) throws SifeapException {
		try {
			usuarioDAL.eliminar(usuario);
			return true;
		} catch (Exception e) {
			throw new SifeapException(e);
		}
	}

	@Override
	public Usuario buscar(Object id) throws SifeapException {
		try {
			Usuario usuario = usuarioDAL.buscar(id);
			return usuario;
		} catch (Exception e) {
			throw new SifeapException(e);
		}
	}
	
	@Override
	public boolean remover(Usuario usuario) throws SifeapException {
		try {
			usuarioDAL.remover(usuario);
			return true;
		} catch (Exception e) {
			throw new SifeapException(e);
		}
	}
	
	@Override
	public UsuarioVO buscarPorId(String id) throws SifeapException {
		try {
			//Consulta el Usuario en la BD de SIFEAP
			Usuario usuario = this.buscar(id);
			
			//Consulta los datos en la BD de Solidario
			VinculadoWrapper vinculado = new VinculadosBridge().buscarPorCedula(id);
			if (vinculado != null) {
				if (!(vinculado.getCedula() != null && vinculado.getCedula().trim().length() > 0)) {
					vinculado = null;
				}
			}
			
			//Arma el VO de Usuario
			UsuarioVO usuarioVo = new UsuarioVO();
			usuarioVo.setUsuario(usuario);
			usuarioVo.setVinculado(vinculado);
			
			return usuarioVo;
		} catch (Exception e) {
			throw new SifeapException(e);
		}
	}

	@Override
	public List<UsuarioVO> buscarTodosAsociados() throws SifeapException {
		List<UsuarioVO> listaUsuariosVo = null;
		List<Usuario> listaUsuarios = this.buscarTodos();
		VinculadoWrapper vinculado;
		if (listaUsuarios != null) {
			listaUsuariosVo = new ArrayList<UsuarioVO>();
			UsuarioVO usuarioVo;
			for (Usuario usuario : listaUsuarios) {
				usuarioVo = new UsuarioVO();
				usuarioVo.setUsuario(usuario);
				
				//Consulta los datos en la BD de Solidario
				vinculado = new VinculadosBridge().buscarPorCedula(usuario.getNombreUsuario());
				usuarioVo.setVinculado(vinculado);
				listaUsuariosVo.add(usuarioVo);
			}
		}
		return listaUsuariosVo;
	}

	@Override
	public byte cambiarContrasena(UsuarioVO usuarioVo) throws SifeapException {
		try{
			//Consulta el usuario de BD
			Usuario usuario = this.buscar(usuarioVo.getUsuario().getNombreUsuario());
			
			//Encripta la contrasena actual
			usuarioVo.getUsuario().setPassword(Util.encriptar(usuarioVo.getUsuario().getPassword()));
			
			//Compara esa contrasena con la contrasena en BD
			if (!usuarioVo.getUsuario().getPassword().equalsIgnoreCase(usuario.getPassword())) {
				return 2;
			}
			
			//Compara contrasena nueva con confirmar contrasena nueva
			if (!usuarioVo.getNuevaContrasena().equals(usuarioVo.getConfirmarContrasena())) {
				return 3;
			}
			
			//Encripto la contrasena
			usuario.setPassword(Util.encriptar(usuarioVo.getNuevaContrasena()));
			
			//Tomo la pregunta de seguridad y la respuesta
			usuario.setPreguntasseguridad(usuarioVo.getUsuario().getPreguntasseguridad());
			usuario.setRespuestapregunta(usuarioVo.getUsuario().getRespuestapregunta());
			
			//Ya no requiere cambio de contrasena
			usuario.setRequierecambio("0");
			
			usuarioDAL.modificar(usuario);
			return 1;
		}catch (Exception e) {
			throw new SifeapException(e);
		}
	}
	
	@Override
	public List<PreguntaSeguridad> buscarTodasPreguntasSeguridad() throws SifeapException {
		try{
			return preguntaSeguridadDAL.buscarTodos();
		}catch (Exception e) {
			throw new SifeapException(e);
		}
	}
	
	@Override
	public PreguntaSeguridad buscarPreguntaSeguridad(Object id) throws SifeapException {
		try {
			PreguntaSeguridad preguntaSeguridad = preguntaSeguridadDAL.buscar(id);
			return preguntaSeguridad;
		} catch (Exception e) {
			throw new SifeapException(e);
		}
	}

	@Override
	public byte habilitarUsuario(Usuario usuario) throws SifeapException {
		try {
			Usuario usuarioConsultado = buscar(usuario.getNombreUsuario());
			
			//Compara las respuestas
			if(!usuario.getRespuestapregunta().trim().equals(usuarioConsultado.getRespuestapregunta().trim())) {
				return 2;
			}
			
			usuarioConsultado = restaurarContrasena(usuarioConsultado);
			
			modificar(usuarioConsultado);
			
			return 1;
		} catch (Exception e) {
			throw new SifeapException(e);
		}
	}
	
	@Override
	public boolean restaurarUsuario(String documento) throws SifeapException {
		try {
			Usuario usuarioConsultado = buscar(documento);
			
			usuarioConsultado = restaurarContrasena(usuarioConsultado);
			
			modificar(usuarioConsultado);
			
			return true;
		} catch (Exception e) {
			throw new SifeapException(e);
		}
	}
	
	private Usuario restaurarContrasena(Usuario usuario) {
		//Desbloquea el usuario
		usuario.setHabilitado("1");
		
		//Restablece la contrasena
		String nuevaContrasena = usuario.getNombreUsuario().substring(usuario.getNombreUsuario().length() - 4, usuario.getNombreUsuario().length());
		
		usuario.setPassword(Util.encriptar(nuevaContrasena));
		
		usuario.setRequierecambio("1"); //Ajusta que requiere cambio de clave
		
		return usuario;
	}
}